tup1 = ('Google', 'Runoob', 1997, 2000)
tup2 = (1, 2, 3, 4, 5 )
tup3 = "a", "b", "c", "d"   #  不需要括号也可以
print (tup1, tup2, tup3)
print (type(tup1), type(tup2), type(tup3))

# 创建空元组
tup4 = ()
print (tup4)

# 元组中只包含一个元素时，需要在元素后面添加逗号，否则括号会被当作运算符使用
tup5 = (50)
print (type(tup5))   # <class 'int'>

tup6 = (50,)
print (type(tup6))   # <class 'tuple'>
# 访问元组，通过索引和切片访问
print ("tup1[0]: ", tup1[0])
print ("tup2[1:5]: ", tup2[1:5])

# 修改元组
# 元组中的元素值是不允许修改的，但我们可以对元组进行连接组合
tup1 = ('Google', 'Runoob', 1997, 2000)
tup2 = (1, 2, 3, 4, 5, 6, 7 )
# TypeError: 'tuple' object does not support item assignment
# tup1[1] = 100
tup3 = tup1 + tup2
print (tup3)

# 元组重复
tup4 = tup1 * 2
print (tup4)

# 元组长度
print (len(tup1))

# 删除元组
# 元组中的元素值是不允许删除的，但我们可以使用del语句来删除整个元组
# del tup1
#组被删除后，输出变量会有异常信息：NameError: name 'tup1' is not defined
# print (tup1)

# 元组运算符
# 与字符串一样，元组之间可以使用 +、+=和 * 号，in 和 not in 进行运算。这就意味着他们可以组合和复制，运算后会生成一个新的元组。

#判断元素是否存在
print (3 in (1, 2, 3))
print (3 not in (1, 2, 3))


#迭代
for x in (1, 2, 3): 
    print (x, end=" ")
    print (type(x))


# 关于元组是不可变的
# 所谓元组的不可变指的是元组所指向的内存中的内容不可变。
# 元组不可变意味着元组中的元素值不能被修改，但元组可以包含可变对象。
# 两者地址不同，重新赋值的元组 tup，绑定到新的对象了，不是修改了原来的对象
tup = ('r', 'u', 'n', 'o', 'o', 'b')
print(id(tup))    # 查看内存地址
tup = (1,2,3)
print(id(tup))     # 查看内存地址

